package br.com.puc.models;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorType;
import javax.persistence.InheritanceType;

import br.com.puc.models.enums.StatusProjeto;

@javax.persistence.Entity
@javax.persistence.Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@javax.persistence.DiscriminatorColumn(name="tipoColaborador", discriminatorType = DiscriminatorType.STRING)
@javax.persistence.Table(name = "COLABORADOR")
public class Colaborador extends Entity {

	private String nome;
	private String email;
	@javax.persistence.Column(insertable=false, updatable=false)
	private String tipoColaborador;
	@javax.persistence.ManyToMany(mappedBy = "participantes", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
	private List<Projeto> projetos = new ArrayList<Projeto>();
	@javax.persistence.ManyToMany(mappedBy = "autores", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
	private List<Publicacao> publicacoes = new ArrayList<Publicacao>();	
	
	public String getNome() {
		return nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
	
	@Override
	public String toString() {
		return getNome();
	}
	
	public List<Projeto> getProjetosPorDataTermino() {
		Collections.sort(projetos, new Comparator<Projeto>() {
			@Override public int compare(Projeto o1, Projeto o2) {
				int result = o1.getDataTermino().compareTo(o2.getDataTermino());
				if (result > 0)
					return -1;
				if (result == 0)
					return 0;
				return 1;
		}});
		return projetos;
	}

	public List<Projeto> getProjetos() {
		return projetos;
	}

	public void setProjetos(List<Projeto> projetos) {
		this.projetos = projetos;
	}
	
	public String getTipoColaborador() {
		return tipoColaborador;
	}
	
	public List<Publicacao> getPublicacoesPorData() {
		Collections.sort(publicacoes, new Comparator<Publicacao>() {
			@Override public int compare(Publicacao o1, Publicacao o2) {
				if (o1.getAno() > o2.getAno())
					return -1;
				if (o1.getAno() == o2.getAno())
					return 0;
				return 1;
		}});
		return publicacoes;
	}

	public List<Publicacao> getPublicacoes() {
		return publicacoes;
	}

	public void setPublicacoes(List<Publicacao> publicacoes) {
		this.publicacoes = publicacoes;
	}

	public List<Projeto> getProjetosEmAndamento() {
		List<Projeto> emAndamento = new ArrayList<Projeto>();
		for (Projeto projeto : projetos) {
			if (projeto.getStatus() == StatusProjeto.EM_ANDAMENTO)
				emAndamento.add(projeto);	
		}
		return emAndamento;
	}
}
